// package com.greate.community.service;
//
// import com.greate.community.dao.elasticsearch.DiscussPostRepository;
// import com.greate.community.entity.DiscussPost;
// import org.elasticsearch.action.search.SearchResponse;
// import org.elasticsearch.index.query.QueryBuilders;
// import org.elasticsearch.search.SearchHit;
// import org.elasticsearch.search.SearchHits;
// import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
// import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
// import org.elasticsearch.search.sort.SortBuilders;
// import org.elasticsearch.search.sort.SortOrder;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.data.domain.Page;
// import org.springframework.data.domain.PageRequest;
// import org.springframework.data.domain.Pageable;
// import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
// import org.springframework.data.elasticsearch.core.SearchResultMapper;
// import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
// import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
// import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
// import org.springframework.data.elasticsearch.core.query.SearchQuery;
// import org.springframework.stereotype.Service;
//
// import java.util.ArrayList;
// import java.util.Date;
// import java.util.List;
//
// /**
//  * 搜索相关
//  */
// @Service
// public class ElasticsearchService {
//
//     @Autowired
//     private DiscussPostRepository discussPostRepository;
//
//     @Autowired
//     private ElasticsearchTemplate elasticsearchTemplate;
//
//     /**
//      * 将数据插入 Elasticsearch 服务器
//      * @param post
//      */
//     public void saveDiscusspost(DiscussPost post) {
//         discussPostRepository.save(post);
//     }
//
//     /**
//      * 将数据从 Elasticsearch 服务器中删除
//      * @param id
//      */
//     public void deleteDiscusspost(int id) {
//         discussPostRepository.deleteById(id);
//     }
//
//     /**
//      * 分页搜索
//      * @param keyword 搜索的关键词
//      * @param current 当前页码（这里的 Page 是 Spring 提供的，而非我们自己实现的那个）
//      * @param limit 每页显示多少条数据
//      * @return
//      */
//     public Page<DiscussPost> searchDiscussPost(String keyword, int current, int limit) {
//         SearchQuery searchQuery = new NativeSearchQueryBuilder()
//                 .withQuery(QueryBuilders.multiMatchQuery(keyword, "title", "content"))
//                 .withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
//                 .withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
//                 .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
//                 .withPageable(PageRequest.of(current, limit))
//                 .withHighlightFields(
//                         new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
//                         new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
//                 ).build();
//
//         return elasticsearchTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {
//             @Override
//             public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
//                 // 获取命中的数据
//                 SearchHits hits = searchResponse.getHits();
//                 if (hits.getTotalHits() <= 0) {
//                     return null;
//                 }
//
//                 // 处理命中的数据
//                 List<DiscussPost> list = new ArrayList<>();
//                 for (SearchHit hit : hits) {
//                     DiscussPost post = new DiscussPost();
//
//                     String id = hit.getSourceAsMap().get("id").toString();
//                     post.setId(Integer.valueOf(id));
//
//                     String userId = hit.getSourceAsMap().get("userId").toString();
//                     post.setUserId(Integer.valueOf(userId));
//
//                     String title = hit.getSourceAsMap().get("title").toString();
//                     post.setTitle(title);
//
//                     String content = hit.getSourceAsMap().get("content").toString();
//                     post.setContent(content);
//
//                     String status = hit.getSourceAsMap().get("status").toString();
//                     post.setStatus(Integer.valueOf(status));
//
//                     String createTime = hit.getSourceAsMap().get("createTime").toString();
//                     post.setCreateTime(new Date(Long.valueOf(createTime)));
//
//                     String commentCount = hit.getSourceAsMap().get("commentCount").toString();
//                     post.setCommentCount(Integer.valueOf(commentCount));
//
//                     // 处理高亮显示的内容
//                     HighlightField titleField = hit.getHighlightFields().get("title");
//                     if (titleField != null) {
//                         post.setTitle(titleField.getFragments()[0].toString());
//                     }
//
//                     HighlightField contentField = hit.getHighlightFields().get("content");
//                     if (contentField != null) {
//                         post.setContent(contentField.getFragments()[0].toString());
//                     }
//
//                     list.add(post);
//                 }
//
//                 return new AggregatedPageImpl(list, pageable,
//                         hits.getTotalHits(), searchResponse.getAggregations(), searchResponse.getScrollId(), hits.getMaxScore());
//             }
//         });
//
//     }
//
// }
